package com.common.utils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.StringTokenizer;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.common.utils.beans.DateSectionBean;

public class DateUtils {
	
	private static final Logger logger = LoggerFactory.getLogger(DateUtils.class);

	public static String minDate(String a, String b) {
		if (getDaysTween(a, b) > 0)
			return b;
		else
			return a;
	}

	public static String maxDate(String a, String b) {
		if (getDaysTween(a, b) > 0)
			return a;
		else
			return b;
	}
	
	/**
	 * 转换英文格式日期至中文格式
	 * 
	 * @param strEngDate
	 *            (04 May 1998)
	 * @return strCNDate (1998-05-04)
	 */
	public static String engToCNDate(String strEngDate) {
		strEngDate = strEngDate.replaceAll(" ", "");
		String d = strEngDate.substring(0, 2); // 日
		String m = strEngDate.substring(2, 5); // 月
		String y = strEngDate.substring(5, 7); // 年
		// logger.debug(strEngDate);
		// logger.debug(d);
		// logger.debug(m);
		// logger.debug(y);
		int year = Integer.parseInt(y);
		if (year < 20) {
			y = String.valueOf("20" + y);
		} else {
			y = String.valueOf("19" + y);
		}
		if (m.equals("JAN")) {
			m = "01";
		} else if (m.equals("FEB")) {
			m = "02";
		} else if (m.equals("MAR")) {
			m = "03";
		} else if (m.equals("APR")) {
			m = "04";
		} else if (m.equals("MAY")) {
			m = "05";
		} else if (m.equals("JUN")) {
			m = "06";
		} else if (m.equals("JUL")) {
			m = "07";
		} else if (m.equals("AUG")) {
			m = "08";
		} else if (m.equals("SEP")) {
			m = "09";
		} else if (m.equals("OCT")) {
			m = "10";
		} else if (m.equals("NOV")) {
			m = "11";
		} else if (m.equals("DEC")) {
			m = "12";
		}
		String strCNDate = y + "-" + m + "-" + d;
		return strCNDate;
	}

	/**
	 * 拼接日期时间字符串。 在时期与时间串之间加一空格； 时间输入省略了分或分秒时，补齐零； 日期为空时，按1970-01-01算。 例：
	 * dtJoin("1990-01-23", ""); // 返回值为"1990-01-23 00:00:00"
	 * dtJoin("1990-01-23", "1"); // 返回值为"1990-01-23 1:00:00"
	 * dtJoin("1990-01-23", "1:23"); // 返回值为"1990-01-23 1:23:00" dtJoin("",
	 * "1:23"); // 返回值为"1970-01-01 1:23:00"
	 * 
	 * @param dateStr
	 *            日期串，格式为YYYY-MM-DD
	 * @param timeStr
	 *            时间串，格式为hh:mm:ss
	 * @return
	 */
	public static String dtJoin(String dateStr, String timeStr) {
		String d = dateStr;
		String t = timeStr;
		if (StringUtils.isBlank(d)) {
			if (StringUtils.isBlank(t))
				return null;
			else {
				d = "1970-01-01";
			}
		}
		if (StringUtils.isBlank(t)) {
			t = "00:00:00";
		} else if (t.length() <= 2) { // hh
			t = t + ":00:00";
		} else if (t.length() <= 5) { // hh:mm
			t = t + ":00";
		}
		return d + " " + t;
	}

	/**
	 * 拼接日期字符串。
	 * 
	 * @param year
	 *            年
	 * @param month
	 *            月
	 * @param day
	 *            日
	 * @return 日期 格式: YYYY-MM-DD
	 */
	public static String dateJoin(int year, int month, int day) {
		if (year > 9999 || year < 1000 || month < 1 || month > 12 || day < 1
				|| day > 31)
			return "";
		String y = Integer.toString(year);
		String m = "";
		if (month > 9)
			m = Integer.toString(month);
		else
			m = "0" + month;
		String d = "";
		if (day > 9)
			d = Integer.toString(day);
		else
			d = "0" + day;
		return (y + "-" + m + "-" + d);
	}

	/**
	 * 拼接时间字符串。
	 * 
	 * @param hour
	 *            时
	 * @param minute
	 *            分
	 * @param second
	 *            秒
	 * @return 时间 格式: HH:mm:ss
	 */
	public static String timeJoin(int hour, int minute, int second) {
		if (second < 0 || second >= 60) {
			minute += second / 60;
			second = second % 60;
		}
		if (minute < 0 || minute >= 60) {
			hour += minute / 60;
			minute = minute % 60;
		}
		if (hour > 24 || hour < 0) {
			hour = hour % 24;
		}
		String h = "";
		if (hour > 9)
			h = Integer.toString(hour);
		else
			h = "0" + hour;
		String m = "";
		if (minute > 9)
			m = Integer.toString(minute);
		else
			m = "0" + minute;
		String s = "";
		if (second > 9)
			s = Integer.toString(second);
		else
			s = "0" + second;
		return (h + ":" + m + ":" + s);
	}

	/**
	 * 日期时间加上一个时间.
	 * 
	 * @param dateStr
	 *            日期时间 "YYYY-MM-DD HH:mm:ss"
	 * @param timeStr
	 *            时间 "HH:mm:ss" 或者 "HH:mm" 或者 "HH"
	 * @return 时间日期 YYYY-MM-DD
	 */
	public static String addTime(String dateStr, String timeStr) {
		try {
			Calendar cal = Calendar.getInstance();
			StringTokenizer strTk = new StringTokenizer(timeStr, ":");
			DateFormat myformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			Date date = myformat.parse(dateStr);
			cal.setTime(date);
			cal.add(Calendar.HOUR, Integer.parseInt(strTk.nextToken()));
			if (strTk.hasMoreElements()) {
				cal.add(Calendar.MINUTE, Integer.parseInt(strTk.nextToken()));
			}
			date = cal.getTime();
			return DateUtils.formatDate(date, "yyyy-MM-dd HH:mm:ss");
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 取出日期时间中的日期
	 * 
	 * @param dt
	 *            时间日期 "YYYY-MM-DD HH:mm:ss"
	 * @return 时间 YYYY-MM-DD
	 */
	public static String getDateOfDT(String dt) {
		String date = "";
		if (StringUtils.notBlank(dt)) {
			if (dt.length() <= 10) {
				date = dt;
			} else {
				date = dt.substring(0, 10);
			}
		}
		return date;
	}

	/**
	 * 取出日期时间中的时间
	 * 
	 * @param dt
	 *            时间日期 "YYYY-MM-DD HH:mm:ss"
	 * @return 时间 HH:mm:ss
	 */
	public static String getTimeOfDT(String dt) {
		String time = "";
		if (StringUtils.notBlank(dt) && dt.length() > 11) {
			if (dt.length() <= 19) {
				time = dt.substring(11);
			} else {
				time = dt.substring(11, 19);
			}
		}
		return time;
	}
	/**
	 * 返回输入的字符串代表的Calendar对象.
	 * 
	 * @param String
	 *            str 输入的字符串,格式=yyyy-MM-dd HH:mm:ss.
	 * @return Calendar 返回代表输入字符串的Calendar对象.
	 */
	public static Calendar getTime(String str) {
		Calendar cal = Calendar.getInstance();
		try {
			DateFormat myformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			Date date = myformat.parse(str);
			cal.setTime(date);
		} catch (Exception e) {
			System.out.println(e);
		}
		return cal;
	}

	/**
	 * 返回输入的字符串代表的Calendar对象.
	 * 
	 * @param String
	 *            str 输入的字符串
	 * @param String
	 *            str 输入的字符串日期格式, 缺省为yyyy-MM-dd
	 * @return Calendar 返回代表输入字符串的Calendar对象
	 */
	public static Calendar getTime(String str, String pattern) {
		Calendar cal = Calendar.getInstance();
		if (pattern == null)
			pattern = "yyyy-MM-dd";
		try {
			DateFormat myformat = new SimpleDateFormat(pattern);
			Date date = myformat.parse(str);
			cal.setTime(date);
		} catch (Exception e) {
			System.out.println(e);
		}
		return cal;
	}

	/**
	 * 返回当前时间,格式HH:mm:ss
	 * 
	 * @return String 当前时间
	 */
	public static String getCurrentTime() {
		String time = null;
		try {
			DateFormat myformat = new SimpleDateFormat("HH:mm:ss");
			time = myformat.format(new Date());
		} catch (Exception e) {
			System.out.println(e);
		}
		return time;
	}

	/**
	 * 以yyyy-MM-dd HH:mm:ss形式返回当前时间
	 * @return
	 * @author lj
	 * @date 2017年5月27日 下午12:01:55
	 */
	public static String getLooseCurrentDateTime() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return sdf.format(new Date());
	}
	
	/**
	 * 返回当前时间,格式HH:mm:ss
	 * 
	 * @return String 当前时间
	 */
	public static String getCurrentDateTime() {
		String time = null;
		try {
			DateFormat myformat = new SimpleDateFormat(
					"yyyy-MM-dd HH:mm:ss.SSS");
			time = myformat.format(new Date());
		} catch (Exception e) {
			System.out.println(e);
		}
		return time;
	}

	/**
	 * 返回当前TimeStamp
	 * 
	 * @return String 当前时间
	 */
	public static String getCurrentTimeStamp() {
		String time = null;
		try {
			DateFormat myformat = new SimpleDateFormat(
					"yyyy-MM-dd HH:mm:ss.SSSSSS");
			time = myformat.format(new Date());
		} catch (Exception e) {
			System.out.println(e);
		}
		return time;
	}

	/**
	 * 整理输入时间,分进刻,秒为0,格式HH:mm:ss
	 * 
	 * @return String 当前时间
	 */
	public static String trimTime(String time) {
		String ret = new String(time);
		try {
			int h = getHour(time);
			int m = getMinute(time);
			int a = (int) Math.round(m * 1.0 / 15.0) * 15;
			ret = timeJoin(h, a * 1, 0);
		} catch (Exception e) {
			System.out.println(e);
		}
		return ret;
	}

	/**
	 * 返回当前年月日期,格式yyyy-MM-dd
	 * 
	 * @return String 年月日期
	 */
	public static String getCurrentDate() {
		return getCurrentDate("yyyy-MM-dd");
	}

	/**
	 * 获取当前时间，按照指定的pattern返回字符串
	 * @param pattern 返回的日期格式
	 * @return
	 * @author lj
	 * @date 2017年5月25日 上午10:59:05
	 */
	public static String getCurrentDate(String pattern) {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		String date = sdf.format(new Date());
		return date;
	}
	
	/**
	 * 返回当前年月日期,格式yyyy-MM-dd,时间增加hours个小时.
	 * <p>
	 * 如果想得到晚点的时间，当前为2006-06-02 1:58:00，调用getCurrentDate(1)得到'2006-06-02'，
	 * <p>
	 * 调用getCurrentDate(2)，得到'2006-06-01'。
	 * <p>
	 * 如果要得到早点的时间，hours参数使用负值。
	 * <p>
	 * 
	 * @return String 年月日期
	 */
	public static String getCurrentDate(int hours) {
		String date = null;
		try {
			DateFormat myformat = new SimpleDateFormat("yyyy-MM-dd");
			date = myformat.format(new Date(System.currentTimeMillis() - hours
					* 1000 * 60 * 60));
		} catch (Exception e) {
			System.out.println(e);
		}
		return date;
	}

	/**
	 * 返回当前年 格式YYYY
	 * 
	 * @return String 年
	 */
	public static String getCurrentYear() {
		String year = null;
		try {
			DateFormat myformat = new SimpleDateFormat("yyyy-MM-dd");
			String date = myformat.format(new Date());
			year = date.substring(0, 4);
		} catch (Exception e) {
			System.out.println(e);
		}
		return year;
	}

	/**
	 * 返回日期的年
	 * 
	 * @param dateStr
	 *            输入的字符串 格式YYYY-MM-DD
	 * @return int 年
	 */
	public static int getYear(String dateStr) {
		if (dateStr == null || dateStr.length() < 4)
			return 0;
		String year = dateStr.substring(0, 4);
		return NumberUtils.parseInt(year);
	}

	/**
	 * 返回日期的月
	 * 
	 * @param dateStr
	 *            输入的字符串 格式YYYY-MM-DD
	 * @return int 月
	 */
	public static int getMonth(String dateStr) {
		if (dateStr == null || dateStr.length() < 7)
			return 0;
		String month = dateStr.substring(5, 7);
		return NumberUtils.parseInt(month);
	}

	/**
	 * 返回日期的月
	 * 
	 * @param dateStr
	 *            输入的字符串 格式YYYY-MM-DD
	 * @return int 月
	 */
	public static int getDay(String dateStr) {
		if (dateStr == null || dateStr.length() < 10)
			return 0;
		String day = dateStr.substring(8, 10);
		return NumberUtils.parseInt(day);
	}

	/**
	 * 返回时间的小时
	 * 
	 * @param timeStr
	 *            输入的字符串 格式HH:mm:ss
	 * @return int 小时
	 */
	public static int getHour(String timeStr) {
		if (timeStr == null || timeStr.length() < 2)
			return 0;
		String hour = timeStr.substring(0, 2);
		return NumberUtils.parseInt(hour);
	}

	/**
	 * 返回时间的分钟
	 * 
	 * @param timeStr
	 *            输入的字符串 格式HH:mm:ss
	 * @return int 分钟
	 */
	public static int getMinute(String timeStr) {
		if (timeStr == null || timeStr.length() < 5)
			return 0;
		String minute = timeStr.substring(3, 5);
		return NumberUtils.parseInt(minute);
	}

	/**
	 * 返回时间的分钟
	 * 
	 * @param timeStr
	 *            输入的字符串 格式HH:mm:ss
	 * @return int 分钟
	 */
	public static int getSecond(String timeStr) {
		if (timeStr == null || timeStr.length() < 8)
			return 0;
		String second = timeStr.substring(6, 8);
		return NumberUtils.parseInt(second);
	}

	/**
	 * 返回两个Date对象的之间的分钟数
	 * 
	 * @param Date
	 *            date1 作为被减数的Date对象
	 * @param Date
	 *            date2 作为减数的Date对象
	 * @return int 两个Date对象的之间的分钟数
	 */
	public static int getMinutesTween(Date date1, Date date2) {
		long mill1 = date1.getTime();
		long mill2 = date2.getTime();
		return (int) ((mill1 - mill2) / (1000 * 60));
	}

	/**
	 * 返回两个Date对象的之间的小时数
	 * 
	 * @param Date
	 *            date1 作为被减数的Date对象
	 * @param Date
	 *            date2 作为减数的Date对象
	 * @return int 两个Date对象的之间的小时数
	 */
	public static int getHoursTween(Date date1, Date date2) {
		long mill1 = date1.getTime();
		long mill2 = date2.getTime();
		return (int) ((mill1 - mill2) / (1000 * 60 * 60));
	}

	/**
	 * 返回两个string(格式是：yyyy-MM-dd HH:mm:ss)的之间的小时数
	 * 
	 * @param String
	 *            date1 作为被减数的String对象
	 * @param String
	 *            date2 作为减数的String对象
	 * @return int 两个Date对象的之间的小时数
	 */
	public static int getHoursTween(String date1, String date2) {
		Calendar cal1 = getTime(formatDate(date1, "yyyy-MM-dd HH:mm:ss"));
		Calendar cal2 = getTime(formatDate(date2, "yyyy-MM-dd HH:mm:ss"));
		Date d1 = cal1.getTime();
		Date d2 = cal2.getTime();
		return getHoursTween(d1, d2);
	}

	/**
	 * 返回两个Date对象的之间的秒数
	 * 
	 * @param Date
	 *            date1 作为被减数的Date对象
	 * @param Date
	 *            date2 作为减数的Date对象
	 * @return int 两个Date对象的之间的秒数
	 */
	public static int getSecondTween(Date date1, Date date2) {
		long mill1 = date1.getTime();
		long mill2 = date2.getTime();
		return (int) ((mill1 - mill2) / (1000));
	}

	/**
	 * 返回两个string(格式是：yyyy-MM-dd HH:mm:ss)的之间的秒数
	 * 
	 * @param String
	 *            date1 作为被减数的String对象
	 * @param String
	 *            date2 作为减数的String对象
	 * @return int 两个Date对象的之间的秒数
	 */
	public static int getSecondTween(String date1, String date2) {
		Calendar cal1 = getTime(formatDate(date1, "yyyy-MM-dd HH:mm:ss"));
		Calendar cal2 = getTime(formatDate(date2, "yyyy-MM-dd HH:mm:ss"));
		Date d1 = cal1.getTime();
		Date d2 = cal2.getTime();
		return getSecondTween(d1, d2);
	}

	/**
	 * 返回两个Date对象的之间的天数
	 * 
	 * @param Date
	 *            date1 作为被减数的Date对象
	 * @param Date
	 *            date2 作为减数的Date对象
	 * @return int 两个Date对象的之间的天数
	 */
	public static int getDaysTween(Date date1, Date date2) {
		// return toJulian(date1) - toJulian(date2);
		long mill1 = date1.getTime();
		long mill2 = date2.getTime();
		return (int) ((mill1 - mill2) / (1000 * 60 * 60 * 24));
	}

	/**
	 * 返回两个String(格式是：yyyy-MM-dd HH:mm:ss)对象的之间的天数
	 * 
	 * @param String
	 *            date1 作为被减数的String对象
	 * @param String
	 *            date2 作为减数的String对象
	 * @return int 两个String对象的之间的天数
	 */
	public static int getDaysTween(String date1, String date2) {
		String s1 = date1;
		String s2 = date2;
		s1 = formatDate(s1, "yyyy-MM-dd");
		s2 = formatDate(s2, "yyyy-MM-dd");
		if (s1.length() < 11) {
			s1 = s1 + " 00:00:00";
		}
		if (s2.length() < 11) {
			s2 = s2 + " 00:00:00";
		}
		Calendar cal1 = getTime(formatDate(s1, "yyyy-MM-dd HH:mm:ss"));
		Calendar cal2 = getTime(formatDate(s2, "yyyy-MM-dd HH:mm:ss"));
		Date d1 = cal1.getTime();
		Date d2 = cal2.getTime();
		return getDaysTween(d1, d2);
	}

	public static int getMonthsTween(String date1, String date2) {
		int y1 = getYear(date1);
		int m1 = getMonth(date1);
		int y2 = getYear(date2);
		int m2 = getMonth(date2);
		int m = 0;
		m += (y1 - y2) * 12;
		m += (m1 - m2);
		return m;
	}
	/**
	 * 将Date数据类型转换为特定的格式, 如格式为null, 则使用缺省格式yyyy-MM-dd.
	 * 
	 * @param Date
	 *            day 日期
	 * @param String
	 *            toPattern 要转换成的日期格式
	 * @return String 返回日期字符串
	 */
	public static String formatDate(Date day, String toPattern) {
		String date = null;
		if (day != null) {
			try {
				SimpleDateFormat formatter = null;
				if (toPattern != null)
					formatter = new SimpleDateFormat(toPattern);
				else
					formatter = new SimpleDateFormat("yyyy-MM-dd");
				date = formatter.format(day);
			} catch (Exception e) {
				System.out.println(e);
				return null;
			}
			return date;
		} else
			return null;
	}

	/**
	 * 将原有的日期格式的字符串转换为特定的格式, 如(原有和转换)格式为null, 则使用缺省格式yyyy-MM-dd.
	 * 
	 * @param String
	 *            value 日期格式的字符串
	 * @param String
	 *            fromPattern 原有的日期格式
	 * @param String
	 *            toPattern 转换成的日期格式
	 * @return String 返回日期字符串
	 */
	public static String formatDate(String value, String fromPattern,
			String toPattern) {
		String date = null;
		if (toPattern == null)
			toPattern = "yyyy-MM-dd";
		if (value != null) {
			try {
				SimpleDateFormat formatter = null;
				if (fromPattern != null)
					formatter = new SimpleDateFormat(fromPattern);
				else
					formatter = new SimpleDateFormat("yyyy-MM-dd");
				Date day = formatter.parse(value);
				formatter.applyPattern(toPattern);
				date = formatter.format(day);
			} catch (Exception e) {
				logger.debug("{}", e);
				return value;
			}
			return date;
		} else
			return null;
	}

	/**
	 * 将原有的日期格式的字符串转换为特定的格式, 原有格式为yyyy-MM-dd.
	 * 
	 * @param String
	 *            value 日期格式的字符串
	 * @param String
	 *            toPattern 转换成的日期格式
	 * @return String 返回日期字符串
	 */
	public static String formatDate(String value, String toPattern) {
		return formatDate(value, toPattern, toPattern);
	}

	/**
	 * 判断是否合法日期 允许2005-1-1，2005-01-01
	 * 
	 * @param value
	 * @return
	 */
	public static boolean validDate(String value) {
		if (StringUtils.isBlank(value)) {
			return false;
		}
		try {
			SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
			Date day = formatter.parse(value);
			String date = formatter.format(day);
			if (value.equals(date)) {
				return true;
			}
			int idx1 = value.indexOf("-");
			int idx2 = value.indexOf("-", idx1 + 1);
			// System.out.println("idx1="+idx1);
			// System.out.println("idx2="+idx2);
			if (idx1 < 0 || idx2 < 0 || idx2 <= idx1) {
				return false;
			}
			String y = value.substring(0, idx1);
			String m = value.substring(idx1 + 1, idx2);
			String d = value.substring(idx2 + 1);
			// System.out.println("y="+y);
			// System.out.println("m="+m);
			// System.out.println("d="+d);
			if (NumberUtils.parseInt(y) == getYear(date) && NumberUtils.parseInt(m) == getMonth(date)
					&& NumberUtils.parseInt(d) == getDay(date)) {
				return true;
			}
			return false;
		} catch (Exception e) {
			return false;
		}
	}
	
	/**
	 * 起始日期加上天数，pattern=yyyy-MM-dd
	 * 
	 * @param date
	 * @param d
	 * @return
	 */
	public static String addDate(String date, int d) {
		return addDate(date, d, "yyyy-MM-dd");
	}
	/**
	 * 起始日期加上天数
	 * @param date
	 * @param d
	 * @param pattern
	 * @return
	 * @author lj
	 * @date 2017年6月21日 下午3:15:14
	 */
	public static String addDate(String date, int d, String pattern) {
		String ret = null;
		try {
			Calendar e = getTime(date, pattern);
			e.add(Calendar.DATE, d);
			Date endDate = e.getTime();
			ret = formatDate(endDate, pattern);
		} catch (Exception ex) {
			System.out.println("not date format");
		}
		return ret;
	}

	/**
	 * 起始日期加上月数，pattern=yyyy-MM-dd
	 * 
	 * @param date
	 * @param m
	 * @return
	 */
	public static String addMonth(String date, int m) {
		return addMonth(date, m, "yyyy-MM-dd");
	}
	/**
	 * 起始日期加上月数
	 * 
	 * @param date
	 * @param m
	 * @param pattern
	 * @return
	 */
	public static String addMonth(String date, int m, String pattern) {
		String ret = null;
		try {
			Calendar e = getTime(date, pattern);
			e.add(Calendar.MONTH, m);
			Date endDate = e.getTime();
			ret = formatDate(endDate, pattern);
		} catch (Exception ex) {
			System.out.println("not date format");
		}
		return ret;
	}

	/**
	 * 起始日期加上年数，pattern = yyyy-MM-dd
	 * 
	 * @param date
	 * @param y
	 * @return
	 */
	public static String addYear(String date, int y) {
		return addYear(date, y, "yyyy-MM-dd");
	}
	
	/**
	 * 起始日期加上年数
	 * @param date
	 * @param y
	 * @param pattern
	 * @return
	 * @author lj
	 * @date 2017年6月21日 下午3:14:04
	 */
	public static String addYear(String date, int y, String pattern) {
		String ret = null;
		try {
			Calendar e = getTime(date, pattern);
			e.add(Calendar.YEAR, y);
			Date endDate = e.getTime();
			ret = formatDate(endDate, pattern);
		} catch (Exception ex) {
			System.out.println("not date format");
		}
		return ret;
	}
	
	/**
	 * 补全时间字符串。 时间输入省略了分或分秒时，补齐零； 例： tmFill("01:00"); // 返回值为"01:23:00"
	 * 
	 * @param timeStr
	 *            时间串，格式为hh:mm:ss
	 * @return
	 */
	public static String tmFill(String timeStr) {
		String t = timeStr;
		if (StringUtils.isBlank(t)) {
			t = "00:00:00";
		} else if (t.length() <= 2) { // hh
			t = t + ":00:00";
		} else if (t.length() <= 5) { // hh:mm
			t = t + ":00";
		}
		return t;
	}
	
	public static boolean nowInOpenTime(String sysStartTime, String sysCloseTime) {
		String currTime = getCurrentTime();
		if (!isMinutePat(sysStartTime)) {
			sysStartTime = "07:00:00";
		} else {
			sysStartTime = sysStartTime + ":00";
		}
		if (!isMinutePat(sysCloseTime)) {
			sysCloseTime = "07:00:00";
		} else {
			sysCloseTime = sysCloseTime + ":00";
		}
		int i = getSecondTween("2005-01-01 "
				+ formatDate(currTime, "HH:mm:ss"), "2005-01-01 "
				+ sysStartTime);
		if (i >= 0) {
			int j = getSecondTween("2005-01-01 "
					+ formatDate(currTime, "HH:mm:ss"), "2005-01-01 "
					+ sysCloseTime);
			if (j < 0) {
				return true;
			}
		}
		return false;
	}

	static boolean isMinutePat(String minStr) {
		if (minStr == null || minStr.trim().length() != 5) {
			return false;
		} else {
			try {
				if (Integer.parseInt(minStr.substring(0, 2)) >= 0
						&& Integer.parseInt(minStr.substring(0, 2)) <= 23) {
					if (minStr.substring(2, 3).equals(":")) {
						if (Integer.parseInt(minStr.substring(3, 5)) >= 0
								&& Integer.parseInt(minStr.substring(3, 5)) < 60) {
							return true;
						}
					}
				}
			} catch (Exception e) {
				return false;
			}
		}
		return false;
	}
	
	/**
	 * @author yh 比较输入的两个日期
	 * @param dateStr1、strDate2
	 *            输入的字符串 格式YYYY-MM-DD
	 * @return int 1-输入的第一个日期小于第二个日期； 2-输入的2个日期相等； 3-输入的第一个日期大于第二个日期；
	 */
	public static int compareDate(String strDate1, String strDate2) {
		int intFlag = 0;
		if (strDate1 == null || strDate1.length() < 10 || strDate2 == null
				|| strDate2.length() < 10)
			return intFlag;
		int intYear1 = getYear(strDate1);
		int intMonth1 = getMonth(strDate1);
		int intDay1 = getDay(strDate1);
		int intYear2 = getYear(strDate2);
		int intMonth2 = getMonth(strDate2);
		int intDay2 = getDay(strDate2);
		if (intYear1 < intYear2)
			intFlag = 1;
		else if (intYear1 == intYear2) {
			if (intMonth1 < intMonth2)
				intFlag = 1;
			else if (intMonth1 == intMonth2) {
				if (intDay1 < intDay2)
					intFlag = 1;
				else if (intDay1 == intDay2)
					intFlag = 2;
				else if (intDay1 > intDay2)
					intFlag = 3;
			} else if (intMonth1 > intMonth2)
				intFlag = 3;
		} else if (intYear1 > intYear2)
			intFlag = 3;
		return intFlag;
	}

	public static int getMinutesTween(String date1, String date2) {
		Calendar cal1 = getTime(formatDate(date1, "yyyy-MM-dd HH:mm:ss"));
		Calendar cal2 = getTime(formatDate(date2, "yyyy-MM-dd HH:mm:ss"));
		Date d1 = cal1.getTime();
		Date d2 = cal2.getTime();
		return getMinutesTween(d1, d2);
	}

	/**
	 * 取日期在周中的位置，周一为1，周日为7
	 * 
	 * @param date
	 * @return
	 */
	public static int getDayOfWeek(String date) {
		int year = getYear(date);
		int month = getMonth(date);
		int day = getDay(date);
		// 取出该周起止日期.
		GregorianCalendar cal = new GregorianCalendar(year, month - 1, day);
		int dw = cal.get(GregorianCalendar.DAY_OF_WEEK);
		if (dw == GregorianCalendar.SUNDAY) {
			return 7;
		}
		return dw - 1;
	}

	
	/**
	 * 取得日期在月中的位置，1号为1,10号为10
	 * 
	 * @param date
	 * @return
	 */
	public static int getDayOfMonth(String date){
		int year = getYear(date);
		int month = getMonth(date);
		int day = getDay(date);
		GregorianCalendar cal = new GregorianCalendar(year, month - 1, day);
		return cal.get(GregorianCalendar.DAY_OF_MONTH);		 
	}
	
	/**
	 * 获取上周第一天
	 * @return
	 */
	public static String getLastWeekFirDay(){
		String today=getCurrentDate();
		int dayweek=getDayOfWeek(today);
		DateFormat myformat = new SimpleDateFormat("yyyy-MM-dd");
		Calendar e=Calendar.getInstance();
		e.setTime(new Date());
		e.add(Calendar.DAY_OF_WEEK,-(dayweek+6));
		Date date=e.getTime();
		return	myformat.format(date);
		
	}
	/**
	 * 获取上周最后一天
	 * @return
	 */
	public static String getLastWeekLastDay(){
		String today=getCurrentDate();
		int dayweek=getDayOfWeek(today);
		DateFormat myformat = new SimpleDateFormat("yyyy-MM-dd");
		Calendar e=Calendar.getInstance();
		e.setTime(new Date());
		e.add(Calendar.DAY_OF_WEEK,-dayweek);
		Date date=e.getTime();
		return	myformat.format(date);
	}
	/**
	 * 获取上个月第一天
	 * @return
	 */
	public static String getLastMonthFirDay(){
		String date =getLastMonthLastDay();
		return date.substring(0,8)+"01";
	}
	/**
	 * 获取上个月最后一天
	 * @return
	 */
	public static String getLastMonthLastDay(){
		DateFormat myformat = new SimpleDateFormat("yyyy-MM-dd");
		Calendar e=Calendar.getInstance();
		e.setTime(new Date());
		int dayOfMonth=e.get(Calendar.DAY_OF_MONTH);
		e.add(Calendar.DAY_OF_YEAR, -dayOfMonth);
		Date date=e.getTime();
		return	myformat.format(date);
		
	}
	/**
	 * 获取昨天日期
	 * @return
	 */
	public static String getYesterDay(){
		DateFormat myformat = new SimpleDateFormat("yyyyMMdd");
		Calendar e=Calendar.getInstance();
		e.setTime(new Date());
		e.add(Calendar.DAY_OF_YEAR, -1);
		Date date=e.getTime();
		return	myformat.format(date);
	}
	/**
	 * 获取明天日期
	 * @return
	 */
	public static String getNextDay(){
		DateFormat myformat = new SimpleDateFormat("yyyyMMdd");
		Calendar e=Calendar.getInstance();
		e.setTime(new Date());
		e.add(Calendar.DAY_OF_YEAR, +1);
		Date date=e.getTime();
		return	myformat.format(date);
	}
	/**
	 * 计算出两个时间间隔期间内的所有周末起始日期和结束日期
	 * 
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static List<DateSectionBean> getDateSectionWeeks(String date1,
			String date2) {
		int dw1 = getDayOfWeek(date1);
		int dw2 = getDayOfWeek(date2);
		date2 = addDate(date2, (7 - dw2));
		String startdate = addDate(date1, -(dw1 - 1));
		// 计算周末日期
		String enddate = addDate(startdate, 6);
		// 计算当期日期
		String today = getCurrentDate();
		List<DateSectionBean> list = new ArrayList<DateSectionBean>();
		// 当该周周末日期小于当前日期时并且小于等于终止日期前继续
		while (compareDate(enddate, today) == 1
				&& (compareDate(enddate, date2) == 1 || compareDate(enddate, date2) == 2)) {
			DateSectionBean dateBean = new DateSectionBean();
			dateBean.setStartDate(startdate);
			dateBean.setEndDate(enddate);
			list.add(dateBean);
			// 继续算下一周
			startdate = addDate(enddate, 1);
			enddate = addDate(startdate, 6);
		}

		return list;
	}
	/**
	 * 计算两个年月间隔内所有月份的起始日期和结束日期
	 * @param ym1
	 * @param ym2
	 * @return
	 */
	public static List<DateSectionBean> getDateSectionMonths(String ym1,
			String ym2) {
		// 得到开始年月该月份的第一天
		String startdate = ym1 + "-01";
		// 得到开始年月该月份的最后一天
		int maxday=getMaxDaybyYearAndMonth(new Integer(ym1.substring(0, 4)),new Integer(ym1.substring(5, 7)));
		String enddate = ym1 +"-"+ maxday;
		//就算结束年月的该月份的最后一天
		maxday=getMaxDaybyYearAndMonth(new Integer(ym2.substring(0, 4)),new Integer(ym2.substring(5, 7)));
		String ym2enddate=ym2+"-"+maxday;
		// enddate.compareTo(anotherString)
		// 计算当期日期
		String today = getCurrentDate();
		List<DateSectionBean> list = new ArrayList<DateSectionBean>();
		// 该月月末日起小于当前日期时并且小于等于终止日期前继续
		while (enddate.compareTo(today) < 0
				&& enddate.compareTo(ym2enddate) <= 0) {
			DateSectionBean dateBean = new DateSectionBean();
			dateBean.setStartDate(startdate);
			dateBean.setEndDate(enddate);
			list.add(dateBean);
			// 继续算下一月
			startdate = addMonth(startdate, 1);
			//计算下一个月的最后一天
			maxday=getMaxDaybyYearAndMonth(new Integer(startdate.substring(0, 4)),new Integer(startdate.substring(5, 7)));
			enddate = startdate.substring(0, 7) +"-"+ maxday;
		}

		return list;
	}
	/**
	 * 根据年月得到该年月的最大天数
	 * @param year
	 * @param month
	 * @return
	 */
	public static int getMaxDaybyYearAndMonth(int year, int month) {
		 int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
		 if (2 == month && 0 == (year % 4)
				 && (0 != (year % 100) || 0 == (year % 400))) {
		 days[1] = 29;
		 }
		 return days[month-1];
	}
	
	/** 
     * 获取SimpleDateFormat 
     * @param parttern 日期格式 
     * @return SimpleDateFormat对象 
     * @throws RuntimeException 异常：非法日期格式 
     */  
    private static SimpleDateFormat getDateFormat(String parttern) throws RuntimeException {  
        return new SimpleDateFormat(parttern);  
    }  
    
	/** 
     * 将日期字符串转化为日期。失败返回null。 
     * @param date 日期字符串 
     * @param parttern 日期格式 
     * @return 日期 
     */  
    public static Date stringToDate(String date, String parttern) {  
        Date myDate = null;  
        if (date != null) {  
            try {  
                myDate = getDateFormat(parttern).parse(date);  
            } catch (Exception e) {  
            }  
        }  
        return myDate;  
    }

    /**
     * 判断当前时间是否在date1和date2之间
     * @param date1 yyyy-MM-dd HH:mm:ss
     * @param date2 yyyy-MM-dd HH:mm:ss
     * @return
     * @author lj
     * @throws ParseException 
     * @date 2017年5月27日 上午11:57:08
     */
	public static boolean currentLooseTimeIn(String date1, String date2, String date1Pattern, String date2Pattern) throws ParseException {
		if (StringUtils.isBlank(date1) || StringUtils.isBlank(date2)) {
			return false;
		}
		SimpleDateFormat sdf = getDateFormat("yyyy-MM-dd HH:mm:ss");
		Date d1 = sdf.parse(date1);
		Date d2 = sdf.parse(date2);
		Date curr = new Date();
		long currTime = curr.getTime();
		long d1Time = d1.getTime();
		long d2Time = d2.getTime();
		if (currTime >= d1Time && currTime <= d2Time) {
			return true;
		}
		return false;
	}
	
	/**
	 * 将字符串形式的日期按照指定pattern格式转化为Date类型
	 * @示例
	 * <p>
	 * String odate = "2017-05-31 15:43";<BR/>
	 * String opattern = "yyyy-MM-dd HH:mm";<BR/>
	 * Date date = DateUtils.strDateToPatternDate(odate,opattern);<BR/>
	 * </p>
	 * @param odate 原始date，字符串类型
	 * @param opattern 原始date的pattern
	 * @return
	 * @author lj
	 * @throws ParseException 
	 * @date 2017年5月31日 下午3:42:11
	 */
	public static Date strDateToPatternDate(String odate, String opattern) throws ParseException {
		SimpleDateFormat sdf = getDateFormat(opattern);
		return sdf.parse(odate);
	}
	
	/**
	 * 当前日期加/减step月得到的日期
	 * @param step
	 * @param pattern
	 * @return
	 * @author lj
	 * @date 2017年6月21日 下午3:09:17
	 */
	public static String getCurrTimeChangeNthMonthDate(int step, String pattern) {
		String currDate = DateUtils.getCurrentDate(pattern);
		String lastNthMonthDate = DateUtils.addMonth(currDate, step, pattern);
		return lastNthMonthDate;
	}
	
	/**
	 * 当前日期加/减step年得到的日期
	 * @param step
	 * @param pattern
	 * @return
	 * @author lj
	 * @date 2017年6月21日 下午3:20:21
	 */
	public static String getCurrTimeChangeNthYearDate(int step, String pattern) {
		String currDate = DateUtils.getCurrentDate(pattern);
		String lastNthMonthDate = DateUtils.addYear(currDate, step, pattern);
		return lastNthMonthDate;
	}
	/**
	 * 当前日期加/减step天得到的日期
	 * @param step
	 * @param pattern
	 * @return
	 * @author lj
	 * @date 2017年6月21日 下午3:21:42
	 */
	public static String getCurrTimeChangeNthDayDate(int step, String pattern) {
		String currDate = DateUtils.getCurrentDate(pattern);
		String lastNthMonthDate = DateUtils.addDate(currDate, step, pattern);
		return lastNthMonthDate;
	}
	
}
